<?php
/**
 * 针对MEMCACHE模式的抽象
 * 不太好，临时抽抽的，以后要根据MODEL实际能提供的支持重构
 *
 * @author ananda
 */
abstract class Pattern_Memcache extends Pattern
{
    /**
     * 按页读出时的排序模式
     */
    const ORDER_ASC  = 1;
    const ORDER_DESC = 2;

    /**
     * 缓存中的表名前缀
     * !require!
     * @var <string>
     */
    public $prefix_cache = '';

    /**
     * 缓存连接
     * !require!
     * @var <Connection_Memcache>
     */
    public $conn_cache = null;

    /**
     * 根据列表的最后的ID生成一组用于列表的ID
     * @param <integer> $last_id
     * @param <integer> $page
     * @param <integer> $limit
     * @param <integer> $sort
     * @return <array>
     */
    public function getListId($last_id, $page, $limit, $sort = self::ORDER_DESC)
    {
        $list = array('id' => array(), 'key' => array());

        // 防止出现LAST ID为0的情况
        if (!$last_id) {
            return $list;
        }

        if ($sort == self::ORDER_DESC) {
            $start   = min($last_id - ($page - 1) * $limit, $last_id);
            $end     = max($last_id - ($page) * $limit, 0);
            for ($i = $start; $i > $end; $i--) {
                $list['id'][]  = $i;
                $list['key'][] = $this->generateKey($i);
            }
        } else {
            $last_id = $this->lastInsertId();
            $start   = max(1 + ($page - 1) * $limit, 1);
            $end     = min(1 + ($page) * $limit, $last_id + 1);
            for ($i = $start; $i < $end; $i++) {
                $list['id'][] = $i;
                $list['key'][] = $this->generateKey($i);
            }
        }
        return $list;
    }

    /**
     * 生成在MEMCACHE中存入的键值
     * @param <integer> $id
     * @return <string>
     */
    public function generateKey($id)
    {
        return $this->prefix_cache.$id;
    }

    /**
     * 取得缓存连接对象
     * @return Connection_Memcache
     */
    public function getCacheConnection()
    {
        if (!is_object($this->conn_cache)) {
            $this->conn_cache = Connection::get($this->conn_cache);
        }
        return $this->conn_cache;
    }
}
